//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:20-3-14
// @Time:下午5:33
//

#include "ListernalControl.h"

/**
 * @brief 这两个 回调事件是 内存不安全的
 * 当 新的 回调 覆盖的时候这个 对象就偏移
 */
static Listerner_callbackA cb_A ;
static Listerner_callbackC cb_C ;

ListernalControl::ListernalControl(std::string name)
{
    std::cout << "init ListernalControl name = " << name << std::endl;
    listerName = name;
    // 内部设置 B 回调事件
    cb_B = [](std::string name)
    {
        // 事件触发的时候 将会执行 设定好的动作
        std::cout << "call ListernalControl B success name =" << name << std::endl;
    };

}


void ListernalControl::callEvent(int events, void* userdata)
{
    std::cout << " call Listerner event = " << std::hex << events << std::endl;
    // 注意 内存安全判断 一定要有 可以增加 代码 健壮性
    if ((events & Listerner_Type_A) == Listerner_Type_A && cb_A != nullptr)
    {
        // 一般是上层传递的
        cb_A(123); // 这里 传出 你要给 A 事件的数据
    }

    if ((events & Listerner_Type_B) == Listerner_Type_B && cb_B != nullptr)
    {
        //B 事件 无参数 直接触发
        cb_B(listerName); // 传递 参数辨别
    }

    if ((events & Listerner_Type_C) == Listerner_Type_C && cb_C != nullptr)
    {
        // 一般是上层传递的
        cb_C(123, "call C event"); //
    }

    if ((events & Listerner_Type_D) == Listerner_Type_D && cb_D != nullptr)
    {
        // 一般是上层传递的
        cb_D(userdata); //穿透数据 给 D 回调
    }
}

void ListernalControl::callEventA(int data)
{
    std::cout << " call Listerner callEventA ,tran data =" << data << std::endl;

    if (cb_A)
    {
        cb_A(data);
    }
}

void ListernalControl::setListernerA(Listerner_callbackA cb)
{
    cb_A = cb;
}

void ListernalControl::setListernerC(Listerner_callbackC cb)
{
    cb_C = cb;
}

void ListernalControl::setListernerD(Listerner_callbackD cb)
{
    cb_D = cb;
}

ListernalControl::~ListernalControl()
{
    std::cout << "delete ListernalControl name = " << listerName << std::endl;
}
